window.addEventListener('load', function (event) {
	tpLogin();
	
	tpConfigCall = {
		from : null,
		audio_remote : document.getElementById('remoteAudio'),
		video_remote : document.getElementById('remoteVideo'),
		video_local : document.getElementById('localVideo'),
		events_listener : { events : '*', listener : tpEventsSessionListener },
		sip_caps: [
			{ name: '+g.oma.sip-im' },
			{ name: '+sip.ice' },
			{ name: 'language', value: '\"en,fr\"' }
		]
	};
});

window.addEventListener('unload', function (event) {
	tpLogout();
});

var tpServerAddress = "10.69.173.4";
var visioSession = null;
var tpStack = null;
var tpConfigCall = null;
var pageIndexPresentation = 0;
var pageCountPresentation = 0;
var started = false;
var shared = false;

var tpEventsListener = function (e) {
	switch (e.type) {
		case 'starting' : {
			$('#connectionStatus').val('En train de se connecter au pont');
			break;
		}
		case 'started' : {
			started = true;
			$('#connectionStatus').val('Connecté au pont');
			$('#tpCallCmd').removeAttr('disabled');
			break;
		}
		case 'failed_to_start' : {
			$('#connectionStatus').val('Connection au pont refusée');
			break;
		}
		case 'stopped' : {
			started = false;
			$('#connectionStatus').val('Déconnecté du pont');
			$('#tpCallCmd').attr('disabled', 'true');
			visioSession = null;
			tpStack = null;
			break;
		}
	}
};

var tpEventsSessionListener = function (e) {
	switch (e.type) {
		case 'connecting' : {
			if (e.session === visioSession) {
				$('#connectionStatus').val('En train de joindre la conférence');
			}
			break;
		}
		case 'connected' : {
			if (e.session === visioSession) {
				$('#connectionStatus').val('Vous avez rejoint la conférence');
				$('#hangupCmd').removeAttr('disabled');
				$('.presentationCmd').removeAttr('disabled');
				//$('#fullScreenCmd').removeAttr('disabled');
				document.getElementById('popupBridgeConference').hidePopup();
				showPanel();
			}
			break;
		}
		case 'i_info' : {
			if (e.session === visioSession) {
				receivePresentation(e);
			}
			break;
		}
		case 'terminating' : case 'terminated' : {
			if (e.session === visioSession) {
				$('#connectionStatus').val('Conférence terminée');
				$('#hangupCmd').attr('disabled', 'true');
				$('.presentationCmd').attr('disabled', 'true');
				//$('#fullScreenCmd').attr('disabled', 'true');
				visioSession = null;
				document.getElementById('popupIncomingCall').hidePopup();
				removeSrcMultimedia();
			}
			break;
		}
	}
};

/**
 * Se connecter au pont de conférence.
 * Seuls les valeurs de realm et websocket_proxy_url sont importantes.
 * Les autres valeurs sont "fausses".
 */
function tpLogin() {
	tpStack = new SIPml.Stack({
		realm : tpServerAddress,
		impi : 'xhuy',
		impu : 'sip:xhuy@' + tpServerAddress,
		password : 'secret',
		websocket_proxy_url : 'ws://' + tpServerAddress + ':20060',
		outbound_proxy_url : null,
		ice_servers : null,
		enable_rtcweb_breaker : false,
		events_listener : { events : '*', listener : tpEventsListener }
	});
	tpStack.start();
};

function tpJoin() {
	/** Si l'utilisateur n'est pas connecté au pont, le connecter */
	while (!tpStack || !started) {
		tpLogin();
	}
	/** Une fois connecté, rejoindre la conférence */
	tpCall();
};

/**
 * Appeler le numéro de conférence. Les personnes appellent le même numéro participent
 * à la même conférence.
 */
function tpCall() {
	var to = $('#idBridge').val();
	var b = (to == null || to === '');
	to = 'sip:' + to + '@' + tpServerAddress;
	if (!visioSession && !b) {
		visioSession = tpStack.newSession('call-audiovideo', tpConfigCall);
		visioSession.call(to);
	}
};

function tpHangup() {
	if (visioSession) {
		visioSession.hangup();
	}
};

function tpLogout() {
	if (tpStack) {
		tpStack.stop();
		tpStack = null;
	}
};

function showPopupBridgeConference() {
	document.getElementById('popupBridgeConference').openPopupAtScreen(200, 200, false);
};

/**
 * Proposer à l'utilisateur d'ouvrir un fichier ppt/pptx.
 */
function openFileDialog() {
	if (tpStack && visioSession) {
		var nsIFilePicker = Components.interfaces.nsIFilePicker;
		var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
		fp.init(window, "Ouvrir un fichier", nsIFilePicker.modeOpen);
		fp.open(function () {
			var file = File(fp.file.path);
			uploadPresentation(file);
		});
	}
};

function uploadPresentation (file) {
	if (file.size > 0) {
		var xhr = new XMLHttpRequest();
		var url = "http://" + tpServerAddress + ":20065/presentation";
		var jsonRequestUpload = JSON.stringify({
			action : "req_presentation_upload",
			name : file.name,
			type : file.type,
			size : file.size,
			bridge_id : $('#idBridge').val(),
			bridge_pin : $('#pinBridge').val(),
			user_id : 'xhuy'
		});
		
		/** Envoyer le fichier une fois la première requête reçue par le serveur */
		xhr.onreadystatechange =  function () {
			if (this.status == 200 && this.readyState == XMLHttpRequest.DONE) {
				xhr.open('POST', url);
				xhr.setRequestHeader('Content-type', 'application/file');
				xhr.send(file);
				shared = true;
				$('#sharePresentationBtn').attr('label', 'Fermer la présentation');
			}
		};
		
		/** Envoyer une première requête contenant les informations du fichier à partager */
		xhr.open('POST', url);
		xhr.setRequestHeader('Content-type', 'application/json');
		xhr.send(jsonRequestUpload);
	}
};

function receivePresentation(event) {
	var json = JSON.parse(event.getContentString());
	switch (json.state) {
		case 'opened' : {
			pageIndexPresentation = 0;
			pageCountPresentation = parseInt(json.page_count);
			fetchPresentation(pageIndexPresentation);
			break;
		}
		case 'closed' : {
			pageIndexPresentation = 0;
			pageCountPresentation = 0;
			$('.presentationCmd').removeAttr('disabled');
			break;
		}
		case 'error' : {
			shared = false;
			$('#sharePresentationBtn').attr('label', 'Partager une présentation');
			break;
		}
	}
};

function closePresentation() {
	if (visioSession) {
		var json = JSON.stringify({
			action : 'req_presentation_close'
		});
		visioSession.info(json, 'application/json');
		shared = false;
		$('#sharePresentationBtn').attr('label', 'Partager une présentation');
	}
};

function togglePresentation() {
	if (shared) {
		closePresentation();
	} else {
		openFileDialog();
	}
}

function fetchPresentation(pageIndex) {
	if (visioSession) {
		var json = JSON.stringify({
			action : 'req_presentation_goto',
			page_index : pageIndex
		});
		visioSession.info(json, "application/json");
	}
}

/** Aller vers le diapositive précédent */
function fetchPrevious() {
	if (pageIndexPresentation > 0) {
		fetchPresentation(--pageIndexPresentation);
	}
};

/** Aller vers le diapositive suivant */
function fetchNext() {
	if (pageIndexPresentation < pageCountPresentation - 1) {
		fetchPresentation(++pageIndexPresentation);
	}
};

/** Autoriser drop seulement si c'est un fichier */
function checkDrag(event) {
	var isFile = event.dataTransfer.types.contains('Files');
	if (visioSession && isFile) {
		event.preventDefault();
	}
};

/** Autoriser le partage de la présentation s'il y a exactement un fichier */
function doDrop(event) {
	var nbFiles = event.dataTransfer.files.length;
	var localFile = event.dataTransfer.mozGetDataAt('application/x-moz-file', 0);
	if (nbFiles == 1 && localFile instanceof Components.interfaces.nsIFile) {
		var file = File(localFile.path);
		uploadPresentation(file);
	}
};
